#ifndef _MOTOR_MOTOR_APP_H_
#define _MOTOR_MOTOR_APP_H_

#include "tim.h"
#include "gpio.h"
#include "pid.h"
#include "MPU6050.h"
#include "encoder.h"
#include "SENSOR/sensor_app.h"

/**
 ****************************************************************************************************
 * DONE 用户变量区
 ****************************************************************************************************
 */

#define POS_SALE          1.0f
#define MAX_PWM           1000
#define MIN_PWM           -1000

// // 定义 TB6612 控制引脚
// 电机1
// #define TB6612_IN1_PIN       AIN1_Pin   // 方向控制 IN1
// #define TB6612_IN2_PIN       AIN2_Pin   // 方向控制 IN2
// 电机2
// #define TB6612_IN1_PIN       BIN1_Pin   // 方向控制 IN1
// #define TB6612_IN2_PIN       BIN2_Pin   // 方向控制 IN2
// #define TB6612_1_PORT      GPIOB        

// 电机3
// #define TB6612_IN1_PIN       CIN1_Pin   // 方向控制 IN1
// #define TB6612_IN2_PIN       CIN2_Pin   // 方向控制 IN2
// 电机4
// #define TB6612_IN1_PIN       DIN1_Pin   // 方向控制 IN1
// #define TB6612_IN2_PIN       DIN2_Pin   // 方向控制 IN2
// #define TB6612_2_PORT      GPIOD 

//-----------------------------------------------	   

typedef struct __PWM_HandleTypeDef
{
  TIM_HandleTypeDef *htim;   /*!< PWM使用的定时器  */
  uint32_t Channel;          /*!< PWM通道         */
} PWM_HandleTypeDef;

typedef struct angle_data
{
  float Init_Heading;
  float Target_Heading;
  float Heading;
}Angle_Data;

typedef struct motor_app
{
    //电机1
    float target_position_l;     /*!< 目标位置 (单位：脉冲数) */
    float target_speed_l;        /*!< 目标速度 (单位：脉冲/秒) */
    //电机2
    float target_position_r;     /*!< 目标位置 (单位：脉冲数) */
    float target_speed_r;        /*!< 目标速度 (单位：脉冲/秒) */
}MOTOR_Parameter;

typedef struct __Ship_t
{
  float cx, cy;               /*!< 坐标 */
  float tx, ty;               /*!< 目标坐标 */
  int16_t px, py;             /*!< PID 坐标 */
  float tvx, tvy;             /*!< 目标速度 */
  uint8_t mode;               /*!< 模式 */
  float angle;                /*!< 角度 */
  float init_angle;           /*!< 初始角度 */
  uint8_t acc;                /*!< 加速度 */
  uint16_t tar_speed;         /*!< 目标速度 */
  uint8_t tar_acc;            /*!< 目标加速度 */
  uint16_t cur_speed;         /*!< 当前速度 */
} Ship_t;

typedef struct __MPU6050_Data
{
  int16_t accel_data[3];  /*!< 加速度计数据 */
  int16_t gyro_data[3];   /*!< 陀螺仪数据 */
  float roll;             /*!< 横滚角(度) */
  float pitch;            /*!< 俯仰角(度) */
  float yaw;              /*!< 偏航角(度) */
  float yaw_last;         /*!< 历史偏航角(度) */
  float yaw_t;            /*!< 局部偏航角(度) */
  float roll_init;        /*!< 初始翻滚角(度) */
  float pitch_init;       /*!< 初始俯仰角(度) */
  float yaw_init;         /*!< 初始偏航角(度) */
} MPU6050_Data;

typedef enum
{
  SHIP_FRONT=0,       /*!< 前进 */
  SHIP_BACK,          /*!< 后退 */
  SHIP_LEFT,          /*!< 左转 */
  SHIP_RIGHT,         /*!< 右转 */
}SHIP_DIR;

typedef enum
{
  MOTOR_foreward=0,     /*!< 电机正转 */
  MOTOR_reversal        /*!< 电机反转 */
}MOTOR_DIR;

typedef struct {
    uint32_t start_time;
    uint32_t required_time;  // 基于距离和速度计算的需要运行时间
    uint8_t is_moving;       // 是否正在运动中 
} ShipMoveState;

//-----------------------------------------------	

extern Angle_Data angle_data;
extern Ship_t ship;
extern MPU6050_Data MPU_Data;

extern PWM_HandleTypeDef htim_pwm_l;       // PWM 定时器句柄
extern PWM_HandleTypeDef htim_pwm_r;       // PWM 定时器句柄
extern I2C_HandleTypeDef hi2c_mpu;        //I2C句柄
extern PID_HandleTypeDef speed_pid;      // 速度环 PID 参数
extern PID_HandleTypeDef position_pid;   // 位置环 PID 参数
extern PID_HandleTypeDef angle_pid;      // 角度环 PID 参数

extern float target_position;            // 目标位置 (单位：脉冲数)
extern int move_starte;
extern int move_started;
extern int AUTO_MOVE_TIMER;
extern SHIP_DIR AUTO_MOVE_DIR;
/**
 ****************************************************************************************************
 * DONE 用户函数区
 ****************************************************************************************************
 */

/**
 * @if Eng
 * @brief Initializes PWM for motor control
 * @param htim_pwm - Pointer to PWM timer handle structure 
 * @param htim - Pointer to base timer handle structure
 * @param Channel - Timer channel(s) to use for PWM (TIM_CHANNEL_x or TIM_CHANNEL_ALL)
 * @result PWM is configured for motor speed control
 * @else
 * @brief 初始化电机控制的PWM
 * @param htim_pwm - 指向PWM定时器句柄结构的指针 
 * @param htim - 指向基础定时器句柄结构的指针 
 * @param Channel - 用于PWM的定时器通道(TIM_CHANNEL_x 或 TIM_CHANNEL_ALL)
 * @result PWM被配置用于电机速度控制
 * @endif 
 */
void Motor_PWM_Init(PWM_HandleTypeDef *htim_pwm, TIM_HandleTypeDef *htim, uint32_t Channel);

/**
 * @if Eng 
 * @brief Initializes all motor control hardware
 * @param None 
 * @result Motors and drivers are ready for operation 
 * @else 
 * @brief 初始化所有电机控制硬件 
 * @param 无 
 * @result 电机和驱动器准备就绪
 * @endif 
 */
void Motor_Init(void);

/**
 * @if Eng 
 * @brief Controls ship movement with independent PWM for left/right motors
 * @param pwm_l - PWM value for left motor (0-100%)
 * @param pwm_r - PWM value for right motor (0-100%)
 * @param ship_dir - Direction of ship movement (SHIP_DIR enum)
 * @result Ship moves according to specified parameters 
 * @else 
 * @brief 用独立的左右电机PWM控制船只运动
 * @param pwm_l - 左电机PWM值(0-100%)
 * @param pwm_r - 右电机PWM值(0-100%)
 * @param ship_dir - 船只运动方向(SHIP_DIR枚举)
 * @result 船只按指定参数运动
 * @endif 
 */
void SHIP_RUN(uint16_t pwm_l,uint16_t pwm_r,SHIP_DIR ship_dir);

/**
 * @if Eng
 * @brief Controls left motor independently
 * @param pwm - PWM value for left motor (0-100%)
 * @param motor_dir - Direction of left motor (MOTOR_DIR enum)
 * @result Left motor runs according to specified parameters 
 * @else 
 * @brief 独立控制左电机
 * @param pwm - 左电机PWM值(0-100%)
 * @param motor_dir - 左电机方向(MOTOR_DIR枚举)
 * @result 左电机按指定参数运行
 * @endif 
 */
void SHIP_RUN_LM(uint16_t pwm,MOTOR_DIR motor_dir);

/**
 * @if Eng
 * @brief Controls right motor independently
 * @param pwm - PWM value for right motor (0-100%)
 * @param motor_dir - Direction of right motor (MOTOR_DIR enum)
 * @result Right motor runs according to specified parameters
 * @else
 * @brief 独立控制右电机 
 * @param pwm - 右电机PWM值(0-100%)
 * @param motor_dir - 右电机方向(MOTOR_DIR枚举)
 * @result 右电机按指定参数运行 
 * @endif 
 */
void SHIP_RUN_RM(uint16_t pwm,MOTOR_DIR motor_dir);

/**
 * @if Eng 
 * @brief Controls water sampling motor 
 * @param pwm - PWM value for sampling motor (0-100%)
 * @param dir - Direction of sampling motor 
 * @result Water sampling mechanism is activated
 * @else
 * @brief 控制水采样电机
 * @param pwm - 采样电机PWM值(0-100%)
 * @param dir - 采样电机方向 
 * @result 水采样机构被激活 
 * @endif 
 */
void Motor_Get_water_sample(uint16_t pwm,uint16_t dir);

/**
 * @if Eng
 * @brief Controls water depth measurement motor
 * @param pwm - PWM value for depth motor (0-100%)
 * @param dir - Direction of depth motor 
 * @result Depth measurement mechanism is activated
 * @else
 * @brief 控制水深测量电机 
 * @param pwm - 深度电机PWM值(0-100%)
 * @param dir - 深度电机方向
 * @result 深度测量机构被激活 
 * @endif 
 */
void Motor_Get_water_depth(uint16_t pwm,uint16_t dir);

/**
 * @if Eng
 * @brief Stops specified motor(s)
 * @param stop_number - Motor identifier(s) to stop
 * @result Specified motor(s) are stopped 
 * @else 
 * @brief 停止指定电机 
 * @param stop_number - 要停止的电机标识符, 0为检测用电机，1为运动用电机
 * @result 指定电机被停止
 * @endif 
 */
void Motor_stop(uint16_t stop_number);

/**
 * @if Eng 
 * @brief Moves ship a specified distance with closed-loop control 
 * @param pwm_l - Base PWM for left motor (0-100%)
 * @param pwm_r - Base PWM for right motor (0-100%)
 * @param ship_dir - Direction of movement (SHIP_DIR enum)
 * @param distance - Target distance to move (meters)
 * @param ship_state - Pointer to store movement state information 
 * @return 1 when target distance reached, 0 otherwise 
 * @else 
 * @brief 用闭环控制移动船只指定距离
 * @param pwm_l - 左电机基础PWM(0-100%)
 * @param pwm_r - 右电机基础PWM(0-100%)
 * @param ship_dir - 运动方向(SHIP_DIR枚举)
 * @param distance - 目标移动距离(米)
 * @param ship_state - 存储运动状态信息的指针
 * @return 1表示达到目标距离，0表示未达到 
 * @endif 
 */
uint8_t SHIP_MOVE_DISTANCE(uint16_t pwm_l,uint16_t pwm_r, SHIP_DIR ship_dir, float distance, ShipMoveState* ship_state);

#endif
